package cn.edu.zsc.rbac.domain.service.impl;

import cn.edu.zsc.rbac.domain.dao.IBaseDao;
import cn.edu.zsc.rbac.domain.dto.BaseDto;
import cn.edu.zsc.rbac.domain.entity.BaseEntity;
import cn.edu.zsc.rbac.domain.vo.BaseVo;
import cn.edu.zsc.rbac.domain.vo.Result;
import cn.edu.zsc.rbac.domain.service.IBaseService;

import java.util.Arrays;
import java.util.List;

//抽象服务类，用于封装通用的业务逻辑操作。
abstract class BaseService<
        Entity extends BaseEntity,//实体类，继承自 BaseEntity，表示数据库映射对象。
        Dto extends BaseDto,//数据传输对象（Data Transfer Object），用于接收外部请求的数据。
        Vo extends BaseVo,//视图对象（View Object），用于返回给前端展示的数据。
        Dao extends IBaseDao<Entity>> implements IBaseService<Entity, Dto> {
       //数据访问对象接口，实现 IBaseDao，用于与数据源交互。

    Dao dao;//注入的数据访问层对象，用于执行底层数据操作。

    Vo[] temp;//用于将 List<Vo> 转换为数组时作为类型参考。


    @Override
    public boolean existsById(int id) {
        return dao.existsById(id);
    }//判断是否存在指定 ID 的实体。
    //委托给 DAO 层实现。

    @Override
    public Entity findById(int id) {
        return dao.findById(id);
    }//获取指定 ID 的实体对象。
    // 委托给 DAO 层实现。

    abstract Vo convertToVo(Entity entity);
//抽象方法，需子类实现，用于将实体对象转换为视图对象。
    @Override
    public Result list() {
        List<Vo> list = dao.list().stream().map(this::convertToVo).toList();
        return Result.success("查询成功", list.toArray(temp));
    }//查询所有未被软删除的实体，并转换为 VO 列表。
    //返回统一格式的响应结果 Result。

    abstract Entity createEntity(Dto dto);
   //抽象方法，需子类实现，用于将 DTO 转换为实体对象。
    @Override
    public Result create(Dto dto) {
        Entity entity = createEntity(dto);
        dao.save(entity);
        return Result.success("创建成功！", null);
    } //创建新实体并保存到数据源。
    //使用统一响应格式返回结果。

    abstract void updateEntity(Dto dto, Entity entity);
        //抽象方法，需子类实现，用于更新实体属性。
    @Override
    public Result update(Dto dto, int id) {
        if (!existsById(id)) {
            return Result.failure("更新失败，不存在该数据");
        }
        Entity entity = dao.findById(id);
        updateEntity(dto, entity);
        dao.save(entity);
        return Result.success("更新成功", null);
    }//检查 ID 是否存在，若存在则更新实体。
   // 使用统一响应格式返回结果。
    @Override
    public Result softDelete(int id) {
        if (!existsById(id)) {
            return Result.failure("删除失败，不存在该数据");
        }
        dao.softDelete(id);  //正确调用更新数据方法
        return Result.success("软删除成功", null);
    }//实现软删除操作（逻辑删除）。
    //若实体不存在，返回错误信息。

    @Override
    public Result restore(int id) {
        if (!existsById(id)) {
            return Result.failure("恢复失败，不存在该数据");
        }
        dao.restore(id);     //  正确调用更新数据方法
        return Result.success("恢复成功", null);
    }
}//恢复已被软删除的实体。
// 若实体不存在，返回错误信息。


